Reactã®ãããæŽæ°ã培åºè§£èª¬ãäžèŠãªåã¬ã³ããªã³ã°ãåæžããŠããã©ãŒãã³ã¹ãåäžãããä»çµã¿ãšã广çã«æŽ»çšããããã®ãã¹ããã©ã¯ãã£ã¹ã玹ä»ããŸãã
Reactã®ãããæŽæ°ïŒããã©ãŒãã³ã¹ã®ããã®ç¶æ 倿Žã®æé©å
Reactã®ããã©ãŒãã³ã¹ã¯ãã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããäžã§éåžžã«éèŠã§ããReactãããã©ãŒãã³ã¹ãæé©åããããã«æ¡çšããŠããäž»èŠãªã¡ã«ããºã ã®1ã€ããããæŽæ°ã§ãããã®æè¡ã¯ãè€æ°ã®ç¶æ æŽæ°ãåäžã®åã¬ã³ããªã³ã°ãµã€ã¯ã«ã«ãŸãšããããšã§ãäžèŠãªåã¬ã³ããªã³ã°ã®æ°ãå€§å¹ ã«åæžããã¢ããªã±ãŒã·ã§ã³å šäœã®å¿çæ§ãåäžãããŸãããã®èšäºã§ã¯ãReactã«ããããããæŽæ°ã®è€éãªä»çµã¿ã«ã€ããŠããã®åäœãå©ç¹ãå¶éããããŠé«æ§èœãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«å¹æçã«æŽ»çšããæ¹æ³ã詳ãã解説ããŸãã
Reactã®ã¬ã³ããªã³ã°ããã»ã¹ãçè§£ãã
ãããæŽæ°ã«é£ã³èŸŒãåã«ãReactã®ã¬ã³ããªã³ã°ããã»ã¹ãçè§£ããããšãäžå¯æ¬ ã§ããã³ã³ããŒãã³ãã®ç¶æ ãå€åãããã³ã«ãReactã¯ãã®ã³ã³ããŒãã³ããšãã®åèŠçŽ ãåã¬ã³ããªã³ã°ããŠãæ°ããç¶æ ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«åæ ãããå¿ èŠããããŸãããã®ããã»ã¹ã«ã¯ã以äžã®ã¹ããããå«ãŸããŸãïŒ
- ç¶æ
æŽæ°ïŒ ã³ã³ããŒãã³ãã®ç¶æ
ã¯
setStateã¡ãœããïŒãŸãã¯useStateã®ãããªããã¯ïŒã䜿çšããŠæŽæ°ãããŸãã - 調æŽïŒReconciliationïŒïŒ Reactã¯æ°ããä»®æ³DOMãšä»¥åã®ãã®ãæ¯èŒããŠãå·®ç°ïŒãdiffãïŒãç¹å®ããŸãã
- ã³ãããïŒ Reactã¯ç¹å®ãããå·®ç°ã«åºã¥ããŠå®éã®DOMãæŽæ°ããŸããããã§å€æŽããŠãŒã¶ãŒã«è¡šç€ºãããŸãã
åã¬ã³ããªã³ã°ã¯ãç¹ã«æ·±ãã³ã³ããŒãã³ãããªãŒãæã€è€éãªã³ã³ããŒãã³ãã«ãšã£ãŠãèšç®ã³ã¹ãã®é«ãæäœã«ãªãå¯èœæ§ããããŸããé »ç¹ãªåã¬ã³ããªã³ã°ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸãã
ãããæŽæ°ãšã¯ïŒ
ãããæŽæ°ã¯ãReactãè€æ°ã®ç¶æ æŽæ°ãåäžã®åã¬ã³ããªã³ã°ãµã€ã¯ã«ã«ãŸãšããããã©ãŒãã³ã¹æé©åæè¡ã§ããåã ã®ç¶æ 倿Žã®ãã³ã«ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãã代ããã«ãReactã¯ç¹å®ã®ã¹ã³ãŒãå ã®ãã¹ãŠã®ç¶æ æŽæ°ãå®äºãããŸã§åŸ ã¡ããã®åŸåäžã®åã¬ã³ããªã³ã°ãå®è¡ããŸããããã«ãããDOMãæŽæ°ãããåæ°ãå€§å¹ ã«åæžãããããã©ãŒãã³ã¹ãåäžããŸãã
ãããæŽæ°ã®ä»çµã¿
Reactã¯ãèªèº«ãå¶åŸ¡ããç°å¢å ã§çºçããç¶æ æŽæ°ãèªåçã«ãããåŠçããŸããäŸãã°ã以äžã®ãããªå Žåã§ãïŒ
- ã€ãã³ããã³ãã©ïŒ
onClickãonChangeãonSubmitãªã©ã®ã€ãã³ããã³ãã©å ã®ç¶æ æŽæ°ã¯ãããåŠçãããŸãã - Reactã©ã€ããµã€ã¯ã«ã¡ãœããïŒã¯ã©ã¹ã³ã³ããŒãã³ãïŒïŒ
componentDidMountãcomponentDidUpdateãªã©ã®ã©ã€ããµã€ã¯ã«ã¡ãœããå ã®ç¶æ æŽæ°ããããåŠçãããŸãã - Reactããã¯ïŒ ã€ãã³ããã³ãã©ã«ãã£ãŠããªã¬ãŒããã
useStateãã«ã¹ã¿ã ããã¯ãä»ããç¶æ æŽæ°ã¯ãããåŠçãããŸãã
ãããã®ã³ã³ããã¹ãå ã§è€æ°ã®ç¶æ æŽæ°ãçºçãããšãReactã¯ãããããã¥ãŒã«å ¥ããã€ãã³ããã³ãã©ãŸãã¯ã©ã€ããµã€ã¯ã«ã¡ãœãããå®äºããåŸã«åäžã®èª¿æŽïŒreconciliationïŒããã³ã³ããããã§ãŒãºãå®è¡ããŸãã
äŸïŒ
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
};
return (
Count: {count}
);
}
export default Counter;
ãã®äŸã§ã¯ããIncrementããã¿ã³ãã¯ãªãã¯ãããšhandleClick颿°ãããªã¬ãŒãããsetCountã3ååŒã³åºãããŸããReactã¯ãããã®3ã€ã®ç¶æ
æŽæ°ãåäžã®æŽæ°ã«ãŸãšããŸãããã®çµæãã³ã³ããŒãã³ãã¯äžåºŠã ãåã¬ã³ããªã³ã°ãããcountã¯åsetCountåŒã³åºãã§1ãã€ã§ã¯ãªãã3å¢å ããŸããããReactãæŽæ°ããããåŠçããªãã£ãå Žåãã³ã³ããŒãã³ãã¯3ååã¬ã³ããªã³ã°ãããããšã«ãªããå¹çãäœäžããŸãã
ãããæŽæ°ã®å©ç¹
ãããæŽæ°ã®äž»ãªå©ç¹ã¯ãåã¬ã³ããªã³ã°ã®åæ°ãæžããããšã«ããããã©ãŒãã³ã¹ã®åäžã§ããããã«ããã以äžã®å©ç¹ãããããããŸãïŒ
- UIæŽæ°ã®é«éåïŒ åã¬ã³ããªã³ã°ãæžå°ããããšã§ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®æŽæ°ãè¿ éã«ãªããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžããŸãã
- DOMæäœã®åæžïŒ DOMæŽæ°ã®é »åºŠãæžãããšã§ããã©ãŠã¶ã®äœæ¥ãå°ãªããªããããã©ãŒãã³ã¹ãåäžãããªãœãŒã¹æ¶è²»ãäœäžããŸãã
- ã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹åäžïŒ ãããæŽæ°ã¯ãç¹ã«é »ç¹ãªç¶æ 倿Žã䌎ãè€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠãããã¹ã ãŒãºã§å¹ççãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«è²¢ç®ããŸãã
ãããæŽæ°ãé©çšãããªãå Žå
Reactã¯å€ãã®ã·ããªãªã§æŽæ°ãèªåçã«ãããåŠçããŸããããããåŠçãè¡ãããªãç¶æ³ããããŸãïŒ
- éåæåŠçïŒReactã®å¶åŸ¡å€ïŒïŒ
setTimeoutãsetIntervalããŸãã¯Promiseã®ãããªéåæåŠçã®å éšã§è¡ãããç¶æ æŽæ°ã¯ãéåžžãèªåçã«ã¯ãããåŠçãããŸãããããã¯ãReactããããã®æäœã®å®è¡ã³ã³ããã¹ããå¶åŸ¡ã§ããªãããã§ãã - ãã€ãã£ãã€ãã³ããã³ãã©ïŒ ãã€ãã£ãã®ã€ãã³ããªã¹ããŒïŒäŸïŒ
addEventListenerã䜿çšããŠDOMèŠçŽ ã«çŽæ¥ãªã¹ããŒãã¢ã¿ããããïŒã䜿çšããŠããå Žåããã®ãã³ãã©å ã®ç¶æ æŽæ°ã¯ãããåŠçãããŸããã
äŸïŒéåæåŠçïŒïŒ
import React, { useState } from 'react';
function DelayedCounter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setTimeout(() => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
}, 0);
};
return (
Count: {count}
);
}
export default DelayedCounter;
ãã®äŸã§ã¯ãsetCountãé£ç¶ããŠ3ååŒã³åºãããŠããŸããããããã¯setTimeoutã®ã³ãŒã«ããã¯å
ã«ãããŸãããã®çµæãReactã¯ãããã®æŽæ°ã*ãã*ãã³ã³ããŒãã³ãã¯3ååã¬ã³ããªã³ã°ãããååã¬ã³ããªã³ã°ã§ã«ãŠã³ãã1ãã€å¢å ããŸãããã®æåã¯ãã³ã³ããŒãã³ããé©åã«æé©åããããã«çè§£ããããšãéåžžã«éèŠã§ãã
unstable_batchedUpdatesã«ãã匷å¶çãªãããæŽæ°
Reactãèªåçã«æŽæ°ããããåŠçããªãã·ããªãªã§ã¯ãreact-domããunstable_batchedUpdatesã䜿çšããŠãããåŠçã匷å¶ããããšãã§ããŸãããã®é¢æ°ã䜿çšãããšãè€æ°ã®ç¶æ
æŽæ°ãåäžã®ãããã«ã©ããããããããåäžã®åã¬ã³ããªã³ã°ãµã€ã¯ã«ã§ãŸãšããŠåŠçãããããã«ããããšãã§ããŸãã
泚æïŒ unstable_batchedUpdates APIã¯äžå®å®ãšèŠãªãããŠãããå°æ¥ã®ReactããŒãžã§ã³ã§å€æŽãããå¯èœæ§ããããŸããæ³šæããŠäœ¿çšããå¿
èŠã«å¿ããŠã³ãŒãã調æŽããæºåãããŠãã ããããããããããåŠçã®æåãæç€ºçã«å¶åŸ¡ããããã®äŸ¿å©ãªããŒã«ã§ããããšã«å€ããã¯ãããŸããã
äŸïŒunstable_batchedUpdatesã䜿çšïŒïŒ
import React, { useState } from 'react';
import { unstable_batchedUpdates } from 'react-dom';
function DelayedCounter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setTimeout(() => {
unstable_batchedUpdates(() => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
});
}, 0);
};
return (
Count: {count}
);
}
export default DelayedCounter;
ãã®ä¿®æ£ãããäŸã§ã¯ãsetTimeoutã³ãŒã«ããã¯å
ã®3ã€ã®setCountåŒã³åºããã©ããããããã«unstable_batchedUpdatesã䜿çšãããŠããŸããããã«ãããReactã¯ãããã®æŽæ°ã匷å¶çã«ãããåŠçããçµæãšããŠåäžã®åã¬ã³ããªã³ã°ã§ã«ãŠã³ãã3å¢å ããŸãã
React 18ãšèªåãããåŠç
React 18ã§ã¯ãããå€ãã®ã·ããªãªã§èªåãããåŠçãå°å
¥ãããŸãããããã¯ãã¿ã€ã ã¢ãŠããPromiseããã€ãã£ãã€ãã³ããã³ãã©ããã®ä»ããããã€ãã³ãã®å
éšã§çºçããå Žåã§ããReactãç¶æ
æŽæ°ãèªåçã«ãããåŠçããããšãæå³ããŸããããã«ãããããã©ãŒãã³ã¹ã®æé©åã倧å¹
ã«ç°¡çŽ åãããæåã§unstable_batchedUpdatesã䜿çšããå¿
èŠæ§ãæžå°ããŸãã
äŸïŒReact 18ã®èªåãããåŠçïŒïŒ
import React, { useState } from 'react';
function DelayedCounter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setTimeout(() => {
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
}, 0);
};
return (
Count: {count}
);
}
export default DelayedCounter;
React 18ã§ã¯ãäžèšã®äŸã¯setTimeoutã®å
éšã«ãã£ãŠããsetCountã®åŒã³åºããèªåçã«ãããåŠçããŸããããã¯ãReactã®ããã©ãŒãã³ã¹æé©åèœåã«ãããéèŠãªæ¹åã§ãã
ãããæŽæ°ã掻çšããããã®ãã¹ããã©ã¯ãã£ã¹
ãããæŽæ°ã广çã«æŽ»çšããReactã¢ããªã±ãŒã·ã§ã³ãæé©åããããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- é¢é£ããç¶æ æŽæ°ãã°ã«ãŒãåããïŒ å¯èœãªéããé¢é£ããç¶æ æŽæ°ãåãã€ãã³ããã³ãã©ãŸãã¯ã©ã€ããµã€ã¯ã«ã¡ãœããå ã«ã°ã«ãŒãåãããããåŠçã®å©ç¹ãæå€§éã«æŽ»çšããŸãã
- äžèŠãªç¶æ
æŽæ°ãé¿ããïŒ ã³ã³ããŒãã³ãã®ç¶æ
ãæ
éã«èšèšãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«åœ±é¿ããªãäžèŠãªæŽæ°ãé¿ããããšã§ãç¶æ
æŽæ°ã®åæ°ãæå°éã«æããŸããããããã£ã倿ŽãããŠããªãã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãé²ãããã«ãã¡ã¢åïŒäŸïŒ
React.memoïŒãªã©ã®æè¡ã®äœ¿çšãæ€èšããŠãã ããã - 颿°åæŽæ°ã䜿çšããïŒ ä»¥åã®ç¶æ
ã«åºã¥ããŠç¶æ
ãæŽæ°ããå Žåã¯ã颿°åæŽæ°ã䜿çšããŸããããã«ãããæŽæ°ããããåŠçãããå Žåã§ããæ£ããç¶æ
å€ãæ±ã£ãŠããããšãä¿èšŒãããŸãã颿°åæŽæ°ã§ã¯ã
setStateïŒãŸãã¯useStateã®ã»ãã¿ãŒïŒã«ãåŒæ°ãšããŠä»¥åã®ç¶æ ãåãåã颿°ãæž¡ããŸãã - éåæåŠçã«æ³šæããïŒ Reactã®å€ãããŒãžã§ã³ïŒ18以åïŒã§ã¯ãéåæåŠçå
ã®ç¶æ
æŽæ°ã¯èªåçã«ãããåŠçãããªãããšã«æ³šæããŠãã ãããå¿
èŠã«å¿ããŠ
unstable_batchedUpdatesã䜿çšããŠãããåŠçã匷å¶ããŸãããã ããæ°ãããããžã§ã¯ãã§ã¯ãèªåãããåŠçã®å©ç¹ã掻çšããããã«React 18ã«ã¢ããã°ã¬ãŒãããããšã匷ããå§ãããŸãã - ã€ãã³ããã³ãã©ãæé©åããïŒ ã¬ã³ããªã³ã°ããã»ã¹ãé ãããå¯èœæ§ã®ããäžèŠãªèšç®ãDOMæäœãé¿ããããã«ãã€ãã³ããã³ãã©å ã®ã³ãŒããæé©åããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããïŒ Reactã®ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãããããæŽæ°ãããã«æé©åã§ããé åãç¹å®ããŸããReact DevToolsã®Performanceã¿ãã¯ãåã¬ã³ããªã³ã°ãèŠèŠåããæ¹åã®æ©äŒãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒé¢æ°åæŽæ°ïŒïŒ
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => prevCount + 1);
setCount(prevCount => prevCount + 1);
setCount(prevCount => prevCount + 1);
};
return (
Count: {count}
);
}
export default Counter;
ãã®äŸã§ã¯ã颿°åæŽæ°ã䜿çšããŠã以åã®å€ã«åºã¥ããŠcountãã€ã³ã¯ãªã¡ã³ãããŠããŸããããã«ãããæŽæ°ããããåŠçãããŠãcountãæ£ããã€ã³ã¯ãªã¡ã³ããããããšãä¿èšŒãããŸãã
çµè«
Reactã®ãããæŽæ°ã¯ãäžèŠãªåã¬ã³ããªã³ã°ãåæžããããšã§ããã©ãŒãã³ã¹ãæé©åããããã®åŒ·åãªã¡ã«ããºã ã§ãããããæŽæ°ãã©ã®ããã«æ©èœãããããã®å¶éããããŠããã广çã«æŽ»çšããæ¹æ³ãçè§£ããããšã¯ã髿§èœãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§éåžžã«éèŠã§ãããã®èšäºã§æŠèª¬ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãReactã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãšå šäœçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããReact 18ãèªåãããåŠçãå°å ¥ããããšã§ãç¶æ 倿Žã®æé©åã¯ããã«ç°¡åãã€å¹æçã«ãªããéçºè ã¯çŽ æŽããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®æ§ç¯ã«éäžã§ããããã«ãªããŸãã